/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * DatosEcocardiogramaPanel.java
 *
 * Created on 17/01/2011, 17:22:06
 */

package presentacion.tratamiento_y_practica;

import hibernate.objeto.BalanceHidroelectrolitico;
import hibernate.objeto.EgresoBalanceHidroelectrolitico;
import hibernate.objeto.IngresoBalanceHidroelectrolitico;
import java.awt.Component;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Vector;
import javax.swing.JDialog;
import javax.swing.JPanel;
import logica.BalanceHidroelectroliticoLogica;
import logica.CapaLogica;
import logica.EgresoBalanceHidroelectroliticoLogica;
import logica.IngresoBalanceHidroelectroliticoLogica;
import presentacion.CapaPresentacion;
import presentacion.utilidad.maquetado.Fuente;
import presentacion.utilidad.maquetado.Icono;
import presentacion.utilidad.maquetado.InformeError;

/**
 *
 * @author Gonzalo
 */
public class DatosBalanceHidroelectrolitico extends javax.swing.JPanel {

 
    public DatosBalanceHidroelectrolitico(BalanceHidroelectrolitico 
            balanceHidroelectrolitico) {

        this.balanceHidroelectrolitico = balanceHidroelectrolitico;
        initComponents();
        setearEventosQueCapturanTeclaEnterYEscape();

        if (balanceHidroelectrolitico != null) {
            personalizarJDialog();
        }
    }

    /**
     * Setea datos de la ventana.
     *
     */
    public void personalizarJDialog() {
            if(CapaPresentacion.modoVisualizacion) {
                inhabilitarCampos();
            }
        personalizarJPanels();
    }


    /**
     * Pone en false la propiedad enabled de todos los campos de ingreso.
     *
     */
    private void inhabilitarCampos() {
        panelAgregarIngresoOEgreso.setVisible(false);
    }

    /**
     * Personaliza los JPanels según el tipo de estudio.
     */
    private void personalizarJPanels() {
        Vector<IngresoBalanceHidroelectrolitico>
                vectorIngresoBalanceHidroelectrolitico =
                IngresoBalanceHidroelectroliticoLogica.
                getVectorIngresoBalanceHidroelectroliticoPorIdBalanceHidroelectrolitico(
                balanceHidroelectrolitico.getIdBalanceHidroelectrolitico());
        if (vectorIngresoBalanceHidroelectrolitico != null) {
            for (int i = 0; i < vectorIngresoBalanceHidroelectrolitico.size(); i++) {
                agregarPanel(panelIngresoYEgreso,
                        new DatosIngresoEgresoBalanceHidroelectroliticoPanel(true,
                        vectorIngresoBalanceHidroelectrolitico.elementAt(i), null));

            }
        }
        Vector<EgresoBalanceHidroelectrolitico>
                vectorEgresoBalanceHidroelectrolitico =
                EgresoBalanceHidroelectroliticoLogica.
                getVectorEgresoBalanceHidroelectroliticoPorIdBalanceHidroelectrolitico(
                balanceHidroelectrolitico.getIdBalanceHidroelectrolitico());
        if (vectorEgresoBalanceHidroelectrolitico != null) {
            for (int i = 0; i < vectorEgresoBalanceHidroelectrolitico.size(); i++) {
                agregarPanel(panelIngresoYEgreso,
                        new DatosIngresoEgresoBalanceHidroelectroliticoPanel(false,
                        null, vectorEgresoBalanceHidroelectrolitico.elementAt(i)));

            }
        }
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        panelIngresoYEgresoScrollPane = new javax.swing.JScrollPane();
        panelIngresoYEgreso = new javax.swing.JPanel();
        panelAgregarIngresoOEgreso = new javax.swing.JPanel();
        agregarEgreso = new javax.swing.JButton();
        agregarIngreso = new javax.swing.JButton();
        textoIngresoYEgresos = new javax.swing.JLabel();

        panelIngresoYEgresoScrollPane.setBorder(null);
        panelIngresoYEgresoScrollPane.setPreferredSize(new java.awt.Dimension(834, 227));

        panelIngresoYEgreso.setLayout(new javax.swing.BoxLayout(panelIngresoYEgreso, javax.swing.BoxLayout.Y_AXIS));
        panelIngresoYEgresoScrollPane.setViewportView(panelIngresoYEgreso);

        panelAgregarIngresoOEgreso.setPreferredSize(new java.awt.Dimension(365, 20));

        agregarEgreso.setFont(Fuente.FUENTE_BOTON_INTERNO);
        agregarEgreso.setIcon(Icono.ICONO_16_AGREGAR);
        agregarEgreso.setMnemonic('a');
        agregarEgreso.setText("Agregar egreso");
        agregarEgreso.setToolTipText("Agrega un análisis según el nombre del anális y el tipo");
        agregarEgreso.setPreferredSize(new java.awt.Dimension(175, 20));
        agregarEgreso.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                agregarEgresoActionPerformed(evt);
            }
        });

        agregarIngreso.setFont(Fuente.FUENTE_BOTON_INTERNO);
        agregarIngreso.setIcon(Icono.ICONO_16_AGREGAR);
        agregarIngreso.setMnemonic('a');
        agregarIngreso.setText("Agregar ingreso");
        agregarIngreso.setToolTipText("Agrega un análisis según el nombre del anális y el tipo");
        agregarIngreso.setPreferredSize(new java.awt.Dimension(175, 20));
        agregarIngreso.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                agregarIngresoActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout panelAgregarIngresoOEgresoLayout = new javax.swing.GroupLayout(panelAgregarIngresoOEgreso);
        panelAgregarIngresoOEgreso.setLayout(panelAgregarIngresoOEgresoLayout);
        panelAgregarIngresoOEgresoLayout.setHorizontalGroup(
            panelAgregarIngresoOEgresoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelAgregarIngresoOEgresoLayout.createSequentialGroup()
                .addComponent(agregarIngreso, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(agregarEgreso, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
        );
        panelAgregarIngresoOEgresoLayout.setVerticalGroup(
            panelAgregarIngresoOEgresoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelAgregarIngresoOEgresoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(agregarIngreso, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(agregarEgreso, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        textoIngresoYEgresos.setFont(Fuente.FUENTE_LABEL);
        textoIngresoYEgresos.setForeground(Fuente.COLOR_NORMAL);
        textoIngresoYEgresos.setText("Ingresos y Egresos");
        textoIngresoYEgresos.setPreferredSize(new java.awt.Dimension(70, 20));

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(textoIngresoYEgresos, javax.swing.GroupLayout.PREFERRED_SIZE, 93, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(panelAgregarIngresoOEgreso, javax.swing.GroupLayout.PREFERRED_SIZE, 356, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(panelIngresoYEgresoScrollPane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 843, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(textoIngresoYEgresos, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(panelAgregarIngresoOEgreso, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(panelIngresoYEgresoScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 342, Short.MAX_VALUE)
                .addContainerGap())
        );
    }// </editor-fold>//GEN-END:initComponents

    private void agregarEgresoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_agregarEgresoActionPerformed
        agregarEgreso();
}//GEN-LAST:event_agregarEgresoActionPerformed

    private void agregarIngresoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_agregarIngresoActionPerformed
        agregarIngreso();
    }//GEN-LAST:event_agregarIngresoActionPerformed

    /**
     * Valida en conjunto todos los campos. Aquellos que son obligatorios y los
     * que no.
     *
     * @return true si el objeto está listo para cargarse, false en caso
     * contrario
     */
    public boolean validarCampos() {
        if (validarCamposIngresoOEgreso()) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Valida los campos correspondiente a los campos de determinaciones.
     *
     * @return true si los campos estan listos para cargarse, false en caso
     * contrario
     */
    private boolean validarCamposIngresoOEgreso() {
        boolean retorno = true;
        int paneles = panelIngresoYEgreso.getComponents().length;

        if (paneles == 0) {
            textoIngresoYEgresos.setForeground(Fuente.COLOR_ERROR);
            textoIngresoYEgresos.setToolTipText(InformeError.
                    INFORME_ERROR_TRATAMIENTO_CUIDADOS_DE_INTERNACION_BALANCE_HIDROELECTROLITICO_INGRESO_O_EGRESO_BALANCE_VACIO);
            retorno = false;
        } else {
            for (int i = 0; i < paneles; i++) {
                if (!((DatosIngresoEgresoBalanceHidroelectroliticoPanel)
                        panelIngresoYEgreso.
                        getComponents()[i]).validarCampos()) {
                    retorno = false;
                    textoIngresoYEgresos.setForeground(Fuente.COLOR_ERROR);
                    textoIngresoYEgresos.
                            setToolTipText(InformeError.
                            INFORME_ERROR_TRATAMIENTO_CUIDADOS_DE_INTERNACION_BALANCE_HIDROELECTROLITICO_INGRESO_O_EGRESO_BALANCE_NO_VALIDOS);
                }
            }
        }
        if(retorno) {
                textoIngresoYEgresos.setForeground(Fuente.COLOR_NORMAL);
                textoIngresoYEgresos.setToolTipText(null);
                retorno = true;
            }
        return retorno;
    }

    /**
     * Agrega un balance hidroelectrolítico.
     *
     * @return true si se agregó correctamente, false en caso contrario.
     */
    public boolean agregarBalanceHidroelectrolitico(int[] idObjetoCreado,
            BalanceHidroelectrolitico balanceHidroelectrolitico) {
            this.balanceHidroelectrolitico = balanceHidroelectrolitico;
            //Carga toda la información de la pantalla
            recopilarDatosComponentesIngresoOEgreso();
            //Agrega el objeto
            if ((BalanceHidroelectroliticoLogica.agregarBalanceHidroelectrolitico(
                    datosIngresoOEgresoBalanceHidroelectrolitico,
                    new BalanceHidroelectrolitico(), idObjetoCreado))) {
                return true;
            } else {
                return false;
            }
    }

    /**
     * Recopila toda la informacion ingresada en cada panel de Ingreso o Egrese.
     *
     */
    private void recopilarDatosComponentesIngresoOEgreso() {
        Component[] componentesIngresoOEgreso =
                panelIngresoYEgreso.getComponents();

        datosIngresoOEgresoBalanceHidroelectrolitico =
                new Object[componentesIngresoOEgreso.length][12];

        for (int i = 0; i < componentesIngresoOEgreso.length; i++) {
            datosIngresoOEgresoBalanceHidroelectrolitico[i][
                    CapaLogica.
                    TRATAMIENTO_Y_PRACTICA_CUIDADOS_DE_INTERNACION_BALANCE_HIDROELECTROLITICO_INGRESO_O_EGRESO_TPO] =
                    ((DatosIngresoEgresoBalanceHidroelectroliticoPanel)
                    componentesIngresoOEgreso[i]).getTipo();

            datosIngresoOEgresoBalanceHidroelectrolitico[i][
                    CapaLogica.
                    TRATAMIENTO_Y_PRACTICA_CUIDADOS_DE_INTERNACION_BALANCE_HIDROELECTROLITICO_INGRESO_O_EGRESO_VELOCIDAD] =
                    ((DatosIngresoEgresoBalanceHidroelectroliticoPanel)
                    componentesIngresoOEgreso[i]).getVelocidad();

            datosIngresoOEgresoBalanceHidroelectrolitico[i][
                    CapaLogica.
                    TRATAMIENTO_Y_PRACTICA_CUIDADOS_DE_INTERNACION_BALANCE_HIDROELECTROLITICO_INGRESO_O_EGRESO_CANTIDAD] =
                    ((DatosIngresoEgresoBalanceHidroelectroliticoPanel)
                    componentesIngresoOEgreso[i]).getCantidad();

            datosIngresoOEgresoBalanceHidroelectrolitico[i][
                    CapaLogica.
                    TRATAMIENTO_Y_PRACTICA_CUIDADOS_DE_INTERNACION_BALANCE_HIDROELECTROLITICO_INGRESO_O_EGRESO_ALIMENTACION_ENTERAL] =
                    ((DatosIngresoEgresoBalanceHidroelectroliticoPanel)
                    componentesIngresoOEgreso[i]).getAlimentacionEnteral();

            datosIngresoOEgresoBalanceHidroelectrolitico[i][
                    CapaLogica.
                    TRATAMIENTO_Y_PRACTICA_CUIDADOS_DE_INTERNACION_BALANCE_HIDROELECTROLITICO_INGRESO_O_EGRESO_UBICACION] =
                    ((DatosIngresoEgresoBalanceHidroelectroliticoPanel)
                    componentesIngresoOEgreso[i]).getUbicacion();

            datosIngresoOEgresoBalanceHidroelectrolitico[i][
                    CapaLogica.
                    TRATAMIENTO_Y_PRACTICA_CUIDADOS_DE_INTERNACION_BALANCE_HIDROELECTROLITICO_INGRESO_O_EGRESO_DISPOSICION_CANTIDAD] =
                    ((DatosIngresoEgresoBalanceHidroelectroliticoPanel)
                    componentesIngresoOEgreso[i]).getDispCant();

            datosIngresoOEgresoBalanceHidroelectrolitico[i][
                    CapaLogica.
                    TRATAMIENTO_Y_PRACTICA_CUIDADOS_DE_INTERNACION_BALANCE_HIDROELECTROLITICO_INGRESO_O_EGRESO_HORA_COLOCACION] =
                    ((DatosIngresoEgresoBalanceHidroelectroliticoPanel)
                    componentesIngresoOEgreso[i]).getHoraColocacion();

            datosIngresoOEgresoBalanceHidroelectrolitico[i][
                    CapaLogica.
                    TRATAMIENTO_Y_PRACTICA_CUIDADOS_DE_INTERNACION_BALANCE_HIDROELECTROLITICO_INGRESO_O_EGRESO_FECHA_COLOCACION] =
                    ((DatosIngresoEgresoBalanceHidroelectroliticoPanel)
                    componentesIngresoOEgreso[i]).getFechaColocacion();

            datosIngresoOEgresoBalanceHidroelectrolitico[i][
                    CapaLogica.
                    TRATAMIENTO_Y_PRACTICA_CUIDADOS_DE_INTERNACION_BALANCE_HIDROELECTROLITICO_INGRESO_O_EGRESO_CONCLUSIONES_COLOCACION] =
                    ((DatosIngresoEgresoBalanceHidroelectroliticoPanel)
                    componentesIngresoOEgreso[i]).getConclusionesColocacion();

            datosIngresoOEgresoBalanceHidroelectrolitico[i][
                    CapaLogica.
                    TRATAMIENTO_Y_PRACTICA_CUIDADOS_DE_INTERNACION_BALANCE_HIDROELECTROLITICO_INGRESO_O_EGRESO_HORA_REMOCION] =
                    ((DatosIngresoEgresoBalanceHidroelectroliticoPanel)
                    componentesIngresoOEgreso[i]).getHoraRemocion();

            datosIngresoOEgresoBalanceHidroelectrolitico[i][
                    CapaLogica.
                    TRATAMIENTO_Y_PRACTICA_CUIDADOS_DE_INTERNACION_BALANCE_HIDROELECTROLITICO_INGRESO_O_EGRESO_FECHA_REMOCION] =
                    ((DatosIngresoEgresoBalanceHidroelectroliticoPanel)
                    componentesIngresoOEgreso[i]).getFechaRemocion();

            datosIngresoOEgresoBalanceHidroelectrolitico[i][
                    CapaLogica.
                    TRATAMIENTO_Y_PRACTICA_CUIDADOS_DE_INTERNACION_BALANCE_HIDROELECTROLITICO_INGRESO_O_EGRESO_CONCLUSIONES_REMOCION] =
                    ((DatosIngresoEgresoBalanceHidroelectroliticoPanel)
                    componentesIngresoOEgreso[i]).getConclusionesRemocion();
        }
    }

    private void agregarIngreso() {
            agregarPanel(panelIngresoYEgreso,
                new DatosIngresoEgresoBalanceHidroelectroliticoPanel(true,
                null, null));
            agregarEgreso.setForeground(Fuente.COLOR_NORMAL);
            agregarEgreso.setToolTipText(null);
    }

    private void agregarEgreso() {
            agregarPanel(panelIngresoYEgreso,
                new DatosIngresoEgresoBalanceHidroelectroliticoPanel(false,
                null, null));
            agregarEgreso.setForeground(Fuente.COLOR_NORMAL);
            agregarEgreso.setToolTipText(null);
    }

    /**
     * Agrega un panel al panelExamenComplementarioInterno.
     *
     * @param panelContenedor El panel que contiene al panel que se agregará
     * @param panelComponente El panel componente que se agregará
     *
     */
    private void agregarPanel(JPanel panelContenedor, JPanel panelComponente) {
        panelContenedor.add(panelComponente);
        panelContenedor.revalidate();
        panelContenedor.repaint();
    }

    /**
     * Setea en cada componente del JDialog los eventos que capturarán la tecla
     * enter y escape.
     */
    private void setearEventosQueCapturanTeclaEnterYEscape() {
        //Declaración del evento a capturar
        KeyListener keyListenerEscape = new KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                if (evt.getKeyCode() == KeyEvent.VK_ESCAPE) {
                    cerrarVentana();
                }
            }
        };

        //Setear eventos
        agregarEgreso.addKeyListener(keyListenerEscape);
        agregarIngreso.addKeyListener(keyListenerEscape);
    }

    private void cerrarVentana() {
        JDialog jdialog = (JDialog)
                this.getParent().getParent().getParent().getParent().
                getParent().getParent().getParent().getParent().
                getParent().getParent().getParent().getParent().getParent();
        jdialog.dispose();
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton agregarEgreso;
    private javax.swing.JButton agregarIngreso;
    private javax.swing.JPanel panelAgregarIngresoOEgreso;
    private javax.swing.JPanel panelIngresoYEgreso;
    private javax.swing.JScrollPane panelIngresoYEgresoScrollPane;
    private javax.swing.JLabel textoIngresoYEgresos;
    // End of variables declaration//GEN-END:variables
    private BalanceHidroelectrolitico balanceHidroelectrolitico;
    private Object[][] datosIngresoOEgresoBalanceHidroelectrolitico;    
}
